' *************************
' ** COMPILER DIRECTIVES **
' *************************
$regfile "attiny261.DAT"      'Her hentes registrene for microctrolleren
$crystal = 8000000            'Her fortælles hvilken frekvens oscillatoren har

' *************************
' **    CONFIGURATION    **
' *************************
Config Portb = Output         'Alle bit på port B deffineres som output
Config Porta = Input          'Alle bit på port A deffineres som input
Config Timer1 = Pwm , Prescale = 32       'Timer1 deffineres som PWM timer og prescale sættes til 32 således frekvensen bliver xx MHz
Declare Sub Getval

' ** SETTING UP PWM **        ' I dette afsnit sættes diverse således PWM signalernes opsætning er korrekt
Tccr1a = &B01010011           ' PWM1A = clear up, PWM1B = clear up
Tccr1d.1 = 0                  ' WGM11 = 0   Aktiverer "Phase & frequency correct PWM"
Tccr1d.0 = 1                  ' WGM10 = 1   ^
Ocr1c = &B11111111            ' Timer1 TOP=255
Tcnt1 = &B00000000            ' Timer1 val=0, start Timer1

' Pwm inversion=0, prescaler reset=0, dead time prescaler=0, Prescale = 32
Tccr1b = &B00000110

' Enable PWM1D, CLEAR UP
Tccr1c.0 = 1
Tccr1c.2 = 1
Tccr1c.3 = 0

' Easier aliases for pwm-outputs
Red Alias Ocr1a               'Kalder OCR1A for red
Green Alias Ocr1b             'Kalder OCR1B for green
Blue Alias Ocr1d              'Kalder OCR1D for blue

' ** SETTING UP VARIABLES **
' Variable decleration
Dim Value As Word

' Variable initialization
Value = 0


' *************************
' **      MAIN LOOP      **
' *************************
Do

   Call Getval                'Kalder subfunktionen getval som sætter globalvariablen "value"
   Beginning:                 'Opretter forbindelsespunkt "Beginning"

   If Value < 8 Then          'Hvis value er større eller 0 OG mindre end 9 udføres kodeblokken ellers springes den over.
      Red = 0                 'Sætter rød til 0, altså slukket
      Green = 0               'Sætter grøn til 0, altså slukket
      Blue = 0                'Sætter blå til 0, altså slukket
   End If

   If Value >= 8 And Value < 15 Then
      Red = 255               'Sætter rød til 255, altså 100% tændt
      Green = 0
      Blue = 0
   End If

   If Value >= 15 And Value < 23 Then
      Red = 0
      Green = 255
      Blue = 0
   End If

   If Value >= 23 And Value < 31 Then
      Red = 0
      Green = 0
      Blue = 255
   End If

   If Value >= 31 And Value < 39 Then
      Red = 255
      Green = 255
      Blue = 0
   End If

   If Value >= 39 And Value < 46 Then
      Red = 255
      Green = 0
      Blue = 255
   End If

   If Value >= 46 And Value < 54 Then
      Red = 0
      Green = 255
      Blue = 255
   End If

   If Value >= 54 And Value < 62 Then
      Red = 255
      Green = 255
      Blue = 255
   End If

   If Value >= 70 Then
      Red = 0
      Green = 0
      Blue = 0
   End If

   If Value >= 62 And Value < 70 Then

      Do                      'Her sættes blå til max og alle andre slukkes
         Blue = 255
         Green = 0
         Red = 0

         Do                   'Her forøges styrken på den røde fra 0 til 255 med ca. hvert ms.
            Red = Red + 1
            Waitms 1
            Call Getval       'Kalder subfunktionen getval for at tjekke at PWM signalet ikke forandrer sig.
            If Value < 71 Then       'Hvis PWM signalet har forandret sig slukkes alle farver og programmet køres forfra.
               Blue = 0
               Green = 0
               Red = 0
               Goto Beginning
            End If
         Loop Until Red = 255

         Do                   'Styrken på blå aftager fra 255 til 0.
            Blue = Blue - 1
            Waitms 1
            Call Getval
            If Value < 71 Then
               Blue = 0
               Green = 0
               Red = 0
               Goto Beginning
            End If
         Loop Until Blue = 0

         Do                   'Styrken på grøn forøges fra 0 til 255.
            Green = Green + 1
            Waitms 1
            Call Getval
            If Value < 71 Then
               Blue = 0
               Green = 0
               Red = 0
               Goto Beginning
            End If
         Loop Until Green = 255

         Do                   'Styrken på rød afteges fra 255 til 0.
            Red = Red - 1
            Waitms 1
            Call Getval
            If Value < 71 Then
               Blue = 0
               Green = 0
               Red = 0
               Goto Beginning
            End If
         Loop Until Red = 0

         Do                   'Styrken på blå forøges fra 0 til 255.
            Blue = Blue + 1
            Waitms 1
            Call Getval
            If Value < 71 Then
               Blue = 0
               Green = 0
               Red = 0
               Goto Beginning
            End If
         Loop Until Blue = 255

         Do
            Green = Green - 1 'Styrken på grøn aftages fra 255 til 0.
            Waitms 1
            Call Getval
            If Value < 71 Then
               Blue = 0
               Green = 0
               Red = 0
               Goto Beginning
            End If
         Loop Until Green = 0

      End If                  'Her sluttes "pulseringsløkken" ligesom den startede.. Blå tændt, grøn og rød slukket.
   Loop                       'Loop således pulseringsløkken starter igen
Loop

Sub Getval
   Do
    Value = 0
   Loop Until Pina.0 = 0
   Do
     Value = 0
   Loop Until Pina.0 = 1
   Do
     Value = Value + 1
   Loop Until Pina.0 = 0
End Sub